package com.yc.blog.thread;

import java.util.ArrayList;
import java.util.List;

public class TestWait {
	
	//一次只能一个宠物吃饭，需要加锁，
	Object o = new Object();
	
	//一碗肉
	List<String> bowl = new ArrayList<>();
	
	public void timeToEat() {
		Thread cat = new Thread(new GetFood("猫", "鱼"), "猫");
		Thread dog = new Thread(new GetFood("狗", "骨"), "狗");
		cat.start();//猫开始抢吃的
		dog.start();//狗开始抢吃的
		
		
	}
	
	//猫喜欢吃鱼，狗喜欢吃骨头。他们只吃自己喜欢吃的
	public boolean eat(String who, String meatType) {
		String meat = bowl.get(0);
		if (meat.indexOf(meatType) != -1) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(who + "吃掉" + meat);
			//吃掉
			bowl.remove(0);
			return true;
		} else {
			return false;//不喜欢吃
		}
		
	}
	
	class GetFood implements Runnable {
		private String pet;//宠物
		private String likeFood;//喜欢的食物
		public GetFood(String pet, String likeFood) {
			this.pet = pet;
			this.likeFood = likeFood;
		}

		@Override
		public void run() {
			while(true) {//碗里还有肉就一直吃
				synchronized (o) {
					if (bowl.size() == 0) {
						//碗里没肉了，通知一下其他宠物（否则其他人可能还在一边傻等）
						o.notify();
						System.out.println(pet + "：碗里没肉了，用餐结束");
						break;
					}
					if (!eat(pet, likeFood)) {
						try {
							//发现不是自己喜欢吃的，就把碗让出来。自己先等待
							o.notify();//把其他等待的线程唤醒
							o.wait();
							System.out.println(pet + "：after wait....");
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					
				}
			}
			
		}
		
	}
	
	/**
	 * 主人在一个碗里装了各种食物，有些是猫喜欢吃的有些是狗喜欢吃的
	 * 吃饭时间到了...
	 * @param args
	 */
	public static void main(String[] args) {
		TestWait tw = new TestWait();
		tw.bowl.add("鲤鱼");
		tw.bowl.add("草鱼");
		tw.bowl.add("牛骨");
		tw.bowl.add("黄花鱼");
		tw.bowl.add("猪骨");
		tw.bowl.add("带鱼");
		tw.timeToEat();
	}

}
